#include<iostream>
#include <vector>
#include "testMutex.hpp"
#include <mutex>

int ticket = 0;
pthread_mutex_t mutex;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *route(void *arg)
{
    char *id = (char *)arg;
    while (1)
    {
        pthread_mutex_lock(&mutex);
        if (ticket > 0)
        {
            usleep(1000);
            printf("%s sells ticket:%d\n", id, ticket);
            ticket--;
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            printf("%s wait on cond!\n", id);
            pthread_cond_wait(&cond, &mutex); //醒来的时候，会重新申请锁！！
            printf("%s 被叫醒了\n", id);
        }
        pthread_mutex_unlock(&mutex);
    }
    return nullptr;
}

int main(void)
{
    pthread_t t1, t2, t3, t4;

    pthread_mutex_init(&mutex, NULL);

    pthread_create(&t1, NULL, route, (void *)"thread 1");
    pthread_create(&t2, NULL, route, (void *)"thread 2");
    pthread_create(&t3, NULL, route, (void *)"thread 3");
    pthread_create(&t4, NULL, route, (void *)"thread 4");

    int cnt = 10;

    while(true)
    {
        sleep(5);
        ticket += cnt;
        printf("主线程放票喽, ticket: %d\n", ticket);
        pthread_cond_signal(&cond);
    }


    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);
    pthread_mutex_destroy(&mutex);
}
// using namespace ThreadModule;
// //pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// int ticketnum = 10000;
// #define NUM 4
// class ThreadData
// {
// public:
//     std::string name;
//     pthread_mutex_t *lock_ptr;
// };
// void* Ticket(ThreadData & td)
// {
//     while(true)
//     {
//         pthread_mutex_lock(td.lock_ptr);
//         if(ticketnum > 0)
//         {
//             usleep(1000);
//             printf("get a new ticket, who get it: %ld, id: %d\n",pthread_self() , ticketnum--);
//             pthread_mutex_unlock(td.lock_ptr);
//         }
//         else{
//             pthread_mutex_unlock(td.lock_ptr);

//             break;
            
//         }
//     }
//   return 0;

// }

// int main()
// {
//     pthread_mutex_t lock;
//     pthread_mutex_init(&lock, nullptr);

//     // 1. 构建线程对象
//     std::vector<Thread<ThreadData>> threads;

//     for (int i = 0; i < NUM; i++)
//     {
//         ThreadData *td = new ThreadData();
//         td->lock_ptr = &lock;
//         threads.emplace_back(Ticket, *td);
//         td->name = threads.back().Name();
//     }

//     // 2. 启动线程
//     for (auto &thread : threads)
//     {
//         thread.Start();
//     }

//     // 3. 等待线程
//     for (auto &thread : threads)
//     {
//         thread.Join();
//     }

//     pthread_mutex_destroy(&lock);

//     return 0;
// }
// int main()
// {
//     pthread_mutex_t lock;
//     pthread_mutex_init(&lock,nullptr);
//     pthread_t tid1, tid2 ,tid3 ,tid4;
//     pthread_create(&tid1,nullptr,Ticket,nullptr);
//     pthread_create(&tid2,nullptr,Ticket,nullptr);
//     pthread_create(&tid3,nullptr,Ticket,nullptr);
//     pthread_create(&tid4,nullptr,Ticket,nullptr);

//     pthread_join(tid1,nullptr);
//     pthread_join(tid2,nullptr);
//     pthread_join(tid3,nullptr);
//     pthread_join(tid4,nullptr);

//     pthread_mutex_destroy(&lock);
//     return 0;

// }